home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / msfpayload < prev    next >
Text File  |  2006-06-30  |  4KB  |  184 lines

  1. #!/usr/bin/perl
  2. ###############
  3.  
  4. ##
  5. #         Name: msfpayload
  6. #       Author: H D Moore <hdm [at] metasploit.com>
  7. #      Version: $Revision: 1.36 $
  8. #  Description: Command line interface for generating Metasploit payloads
  9. #      License:
  10. #
  11. #      This file is part of the Metasploit Exploit Framework
  12. #      and is subject to the same licenses and copyrights as
  13. #      the rest of this package.
  14. #
  15. ##
  16.  
  17. require 5.6.0;
  18.  
  19. use strict;
  20. use FindBin qw{$RealBin};
  21. use lib "$RealBin/lib";
  22.  
  23. use Getopt::Std;
  24. use POSIX;
  25.  
  26. use Msf::TextUI;
  27. use Pex;
  28.  
  29. no utf8;
  30. no locale;
  31.  
  32. Msf::UI::ActiveStateSucks();
  33. Msf::UI::BrokenUTF8();
  34.  
  35. my $ui = Msf::TextUI->new($RealBin);
  36. my $FRAMEVERSION = $ui->Version;
  37. my $VERSION = '$Revision: 1.36 $';
  38.  
  39. my %opts;
  40. getopts('hv', \%opts);
  41. Version() if($opts{'v'});
  42.  
  43. $ui->SetTempEnv('_MsfPayload', 1);
  44. $ui->SetTempEnv('DebugLevel', 0);
  45.  
  46. my $exploits = { };
  47. my $payloads = { };
  48. my $payloadsIndex = $ui->LoadPayloads;
  49.  
  50. foreach my $key (keys(%{$payloadsIndex})) {
  51.     $payloads->{$payloadsIndex->{$key}->SelfEndName} = $payloadsIndex->{$key};
  52. }
  53.  
  54. $ui->SetTempEnv('_Payloads', $payloadsIndex);
  55.  
  56. my $sel = shift(@ARGV);
  57. my $p = $payloads->{$sel};
  58. Usage() if($opts{'h'});
  59. Usage() if ! $p;
  60.  
  61. my $action = uc(pop(@ARGV));
  62.  
  63. foreach my $opt (@ARGV) {
  64.   $ui->SetTempEnv(split('=', $opt));
  65. }
  66.  
  67. $p->_Load;
  68. $ui->SetTempEnv('_PayloadName', $sel);
  69. $ui->SetTempEnv('_Payload', $p);
  70.  
  71. if (! $action || $action =~ /^S/)
  72. {
  73.     print "\n" . $ui->DumpPayloadSummary($p);
  74.     exit(0);
  75. }
  76.  
  77. Usage() if $action !~ /^C|^P|^R|^X/;
  78.  
  79. if ($action =~ /^R/) { print $p->Build; exit; }
  80.  
  81. if ($p->Multistage) {
  82.     print STDERR "Warning: Multistage payloads only return first stage\n";
  83. }
  84.  
  85. if ($action =~ /^X/) {
  86.     my (%pos, %parch);
  87.     
  88.     map {   $pos{$_}++ } @{ $p->OS };
  89.     map { $parch{$_}++ } @{ $p->Arch };
  90.  
  91.     # Generate a PE image for Windows payloads
  92.     if ($pos{'win32'} && $parch{'x86'}) {
  93.         ExportWinPE();
  94.     }
  95.     
  96.     # Generate a shell script if there is no architecture
  97.     if (! scalar(keys(%parch))) {
  98.         print "#!/bin/sh\n" . $p->Build;
  99.         exit(0);
  100.     }
  101.     
  102.     print STDERR "Error: No export format is implemented for this payload\n";
  103.     exit(0);
  104. }
  105.  
  106.  
  107. my $r = $action =~ /^C/ ? Pex::Text::BufferC($p->Build) : Pex::Text::BufferPerl($p->Build);
  108.  
  109. print $r;
  110. exit(0);
  111.  
  112. sub Usage
  113. {
  114.     print STDERR "\n   Usage: $0 <payload> [var=val] <S|C|P|R|X>\n\n";
  115.     print STDERR "Payloads: \n";
  116.     print STDERR $ui->DumpPayloads(2, $payloads);
  117.     print STDERR "\n";
  118.     exit(0);
  119. }
  120.  
  121. sub ExportWinPE {
  122.     my $pedata;
  123.     local $/;
  124.     
  125.     if(! open(TMP, "<$RealBin/data/msfpayload/template.exe")) {
  126.         print STDERR "Error: Could not access the template executable: $!\n";
  127.         exit(0);
  128.     }
  129.  
  130.     $pedata = <TMP>;
  131.     close (TMP);
  132.     
  133.     # Comments are limited to 512 bytes
  134.     # Payloads are limited to 8192 bytes
  135.     
  136.     my $bin = $p->Build;
  137.     if (length($bin) > 8192) {
  138.         print STDERR "Error: The payload was too large to generate as an EXE\n";
  139.         exit(0);
  140.     }
  141.     
  142.     my $bin_off = index($pedata, 'PAYLOAD:');
  143.     if ($bin_off == -1) {
  144.         print STDERR "Error: Could not determine the payload start offset\n";
  145.         exit(0);
  146.     }
  147.     
  148.     # Replace the stub data with the actual payload
  149.     substr($pedata, $bin_off, 8192, pack('a8192', $bin));
  150.  
  151.  
  152.     my $com_off = index($pedata, 'COMMENT:');
  153.     if ($com_off == -1) {
  154.         print STDERR "Error: Could not determine the comment start offset\n";
  155.         exit(0);
  156.     }
  157.         
  158.     # Generate a comment for the executable
  159.     my $com = "Created by msfpayload, a component of the Metasploit Framework ($FRAMEVERSION). ".
  160.               "This executable contains the ".$p->SelfEndName." payload, ".
  161.               "generated with the following set of options: ";
  162.  
  163.     foreach (keys %{ $ui->GetTempEnv() }) {
  164.         next if $_ =~ /^_/;
  165.         $com .= $_ ."=". $ui->GetTempEnv($_)." ";
  166.     }
  167.     
  168.     # Replace the stub comment with payload information
  169.     substr($pedata, $com_off, 512, pack('a512', $com));
  170.     
  171.     print $pedata;
  172.     exit(0);
  173. }
  174.  
  175. sub Version {
  176.     my $ver = Pex::Utils::Rev2Ver($VERSION);
  177.     print STDERR qq{
  178.    Framework Version:  $FRAMEVERSION
  179.   Msfpayload Version:  $ver
  180.  
  181. };
  182.   exit(0);
  183. }
  184.